from flask import Blueprint, jsonify, request
import os
from pathlib import Path
import sys
import pandas as pd
import numpy as np
from information_assets_analysis import analyze_assets

information_assets_bp = Blueprint('information_assets', __name__)

# 配置数据文件路径
DATA_DIR = Path('data')
SOURCE_DIR = DATA_DIR / 'source'
ALLDATA_DIR = DATA_DIR / 'alldata'

# 确保目录存在
DATA_DIR.mkdir(parents=True, exist_ok=True)
SOURCE_DIR.mkdir(parents=True, exist_ok=True)
ALLDATA_DIR.mkdir(parents=True, exist_ok=True)

def get_relatives_data(folder_path):
    """获取指定文件夹中的亲属关系数据"""
    try:
        file_path = folder_path / '亲属关系.xlsx'
        print(f"\n[DEBUG] 尝试读取亲属关系文件: {file_path}")
        
        if not file_path.exists():
            print(f"[DEBUG] 亲属关系文件不存在: {file_path}")
            return []
            
        # 读取Excel文件，跳过第一行，使用第二行作为列名
        print(f"[DEBUG] 开始读取Excel文件: {file_path}")
        df = pd.read_excel(file_path, header=1)
        print(f"[DEBUG] Excel文件读取成功，列名: {df.columns.tolist()}")
        
        # 只保留名称和关系列
        if '名称' in df.columns and '关系' in df.columns:
            print(f"[DEBUG] 找到名称和关系列")
            # 去除名称为空的行
            df = df[df['名称'].notna()]
            print(f"[DEBUG] 去除空名称后的行数: {len(df)}")
            # 去除重复值
            df = df.drop_duplicates(subset=['名称'])
            print(f"[DEBUG] 去除重复后的行数: {len(df)}")
            # 返回处理后的数据
            result = df[['名称', '关系']].values.tolist()
            print(f"[DEBUG] 返回的亲属数据数量: {len(result)}")
            print(f"[DEBUG] 亲属数据示例: {result[:3] if result else '无数据'}")
            return result
        else:
            print(f"[DEBUG] 未找到名称或关系列，现有列: {df.columns.tolist()}")
            return []
    except Exception as e:
        print(f"[DEBUG] 读取亲属关系文件出错 {file_path}: {str(e)}")
        import traceback
        traceback.print_exc()
        return []

@information_assets_bp.route('/check-data', methods=['GET'])
def check_data():
    """检查是否存在资产关系数据，同时返回亲属关系数据"""
    try:
        print(f"\n[DEBUG] 开始检查数据")
        print(f"[DEBUG] 当前工作目录: {os.getcwd()}")
        print(f"[DEBUG] DATA_DIR: {DATA_DIR.absolute()}")
        print(f"[DEBUG] SOURCE_DIR: {SOURCE_DIR.absolute()}")
        
        # 确保source目录存在
        SOURCE_DIR.mkdir(parents=True, exist_ok=True)
        
        # 遍历source目录下的所有子文件夹
        folders_data = []
        any_found = False

        # 检查source目录是否存在且可访问
        if SOURCE_DIR.exists() and SOURCE_DIR.is_dir():
            print(f"[DEBUG] SOURCE_DIR存在且可访问")
            for folder in SOURCE_DIR.iterdir():
                if folder.is_dir():
                    print(f"\n[DEBUG] 处理文件夹: {folder.name}")
                    asset_file = folder / '资产关系.xlsx'
                    print(f"[DEBUG] 检查资产关系文件: {asset_file}")
                    exists = asset_file.exists()
                    if exists:
                        any_found = True
                        print(f"[DEBUG] 找到资产关系文件: {asset_file}")
                        
                        # 获取亲属关系数据
                        print(f"[DEBUG] 开始获取亲属关系数据")
                        relatives = get_relatives_data(folder)
                        print(f"[DEBUG] 获取到亲属数量: {len(relatives)}")
                        
                        folders_data.append({
                            'name': folder.name,
                            'exists': exists,
                            'status': '已存在' if exists else '未找到',
                            'relatives': relatives
                        })
                        print(f"[DEBUG] 已添加文件夹数据: {folder.name}, 亲属数量: {len(relatives)}")

        # 如果没有找到任何文件夹，返回特定消息
        if not folders_data:
            print("[DEBUG] 未找到任何数据文件夹")
            return jsonify({
                'exists': False,
                'message': '未找到任何数据文件夹，请确保数据文件夹已正确放置在data/source目录下',
                'folders': []
            })

        print(f"[DEBUG] 返回数据: 文件夹数量={len(folders_data)}, 是否找到数据={any_found}")
        return jsonify({
            'exists': any_found,
            'message': '已找到资产关系数据' if any_found else '未在任何文件夹中找到资产关系.xlsx',
            'folders': folders_data
        })

    except Exception as e:
        print(f"[DEBUG] 发生错误: {str(e)}")
        import traceback
        traceback.print_exc()
        return jsonify({
            'exists': False,
            'message': f'检查数据时出错: {str(e)}',
            'folders': []
        })

@information_assets_bp.route('/get-data', methods=['GET'])
def get_data():
    """获取资产关系数据，支持按亲属名称和资产类型筛选"""
    try:
        # 获取选中的文件夹、亲属和资产类型
        selected_folders = request.args.getlist('folders')
        selected_relatives = request.args.getlist('relatives')
        selected_asset_types = request.args.getlist('asset_types')
        print(f"[DEBUG] 选中的文件夹: {selected_folders}")
        print(f"[DEBUG] 选中的亲属: {selected_relatives}")
        print(f"[DEBUG] 选中的资产类型: {selected_asset_types}")
        
        all_data = []
        
        # 遍历source目录下的所有子文件夹
        if SOURCE_DIR.exists() and SOURCE_DIR.is_dir():
            for folder in SOURCE_DIR.iterdir():
                if folder.is_dir() and folder.name in selected_folders:
                    file_path = folder / '资产关系.xlsx'
                    print(f"[DEBUG] 正在读取文件: {file_path}")
                    
                    if file_path.exists():
                        try:
                            # 读取Excel文件，跳过第一行，使用第二行作为列名
                            df = pd.read_excel(file_path, header=1)
                            
                            # 如果选择了亲属，进行精确匹配筛选
                            if selected_relatives:
                                print(f"[DEBUG] 进行亲属筛选，所属人员列值: {df['所属人员'].unique().tolist()}")
                                df = df[df['所属人员'].isin(selected_relatives)]
                                print(f"[DEBUG] 亲属筛选后的数据行数: {len(df)}")

                            # 如果选择了资产类型，进行精确匹配筛选
                            if selected_asset_types:
                                print(f"[DEBUG] 进行资产类型筛选，资产类型列值: {df['资产类型'].unique().tolist()}")
                                df = df[df['资产类型'].isin(selected_asset_types)]
                                print(f"[DEBUG] 资产类型筛选后的数据行数: {len(df)}")
                            
                            if len(df) > 0:
                                # 添加文件夹名称列
                                df['文件夹'] = folder.name
                                all_data.append(df)
                                print(f"[DEBUG] 成功读取文件: {file_path}, 数据行数: {len(df)}")
                            else:
                                print(f"[DEBUG] 文件 {file_path} 在筛选后没有匹配的数据")
                                
                        except Exception as e:
                            print(f"[DEBUG] 读取文件 {file_path} 时出错: {str(e)}")
                            continue

        if not all_data:
            print("[DEBUG] 未找到任何匹配的数据")
            return jsonify({
                'success': False,
                'error': '未找到匹配的资产关系数据'
            })

        # 合并所有数据
        combined_df = pd.concat(all_data, ignore_index=True)
        print(f"[DEBUG] 合并后的总数据行数: {len(combined_df)}")
        
        # 处理数值列，保留两位小数
        numeric_columns = combined_df.select_dtypes(include=[np.number]).columns
        for col in numeric_columns:
            combined_df[col] = combined_df[col].round(2)
        
        # 转换数据为JSON格式
        data = combined_df.replace({np.nan: None}).to_dict('records')
        
        return jsonify({
            'success': True,
            'data': data
        })

    except Exception as e:
        print(f"[DEBUG] 获取数据时出错: {str(e)}")
        import traceback
        traceback.print_exc()
        return jsonify({
            'success': False,
            'error': f'获取数据时出错: {str(e)}'
        })

@information_assets_bp.route('/analyze-data', methods=['POST'])
def analyze_data():
    """分析资产关系数据"""
    try:
        success = analyze_assets()
        if success:
            return jsonify({
                'success': True,
                'message': '数据分析完成'
            })
        else:
            return jsonify({
                'success': False,
                'error': '数据分析失败'
            })
    except Exception as e:
        print(f"分析数据时出错: {str(e)}")
        import traceback
        traceback.print_exc()
        return jsonify({
            'success': False,
            'error': f'分析数据时出错: {str(e)}'
        })

@information_assets_bp.route('/get-full-data', methods=['GET'])
def get_full_data():
    """获取全量资产关系数据"""
    try:
        all_data = []
        print(1)
        # 遍历source目录下的所有子文件夹
        if SOURCE_DIR.exists() and SOURCE_DIR.is_dir():
            for folder in SOURCE_DIR.iterdir():
                if folder.is_dir():
                    file_path = folder / '资产关系.xlsx'
                    print(f"[DEBUG] 正在读取文件: {file_path}")
                    
                    if file_path.exists():
                        try:
                            # 读取Excel文件，跳过第一行，使用第二行作为列名
                            df = pd.read_excel(file_path, header=1)
                            
                            if len(df) > 0:
                                # 添加文件夹名称列
                                df['文件夹'] = folder.name
                                # 将所有列名转换为字符串类型
                                df.columns = df.columns.astype(str)
                                all_data.append(df)
                                print(f"[DEBUG] 成功读取文件: {file_path}, 数据行数: {len(df)}")
                            else:
                                print(f"[DEBUG] 文件 {file_path} 没有数据")
                                
                        except Exception as e:
                            print(f"[DEBUG] 读取文件 {file_path} 时出错: {str(e)}")
                            continue

        if not all_data:
            print("[DEBUG] 未找到任何数据")
            return jsonify({
                'success': False,
                'error': '未找到资产关系数据'
            })

        # 合并所有数据
        combined_df = pd.concat(all_data, ignore_index=True)
        print(f"[DEBUG] 合并后的总数据行数: {len(combined_df)}")
        
        # 处理数值列，保留两位小数
        numeric_columns = combined_df.select_dtypes(include=[np.number]).columns
        for col in numeric_columns:
            combined_df[col] = combined_df[col].round(2)
        print(f'[DEBUG] 处理数值列，保留两位小数')
        # 转换数据为JSON格式
        data = combined_df.replace({np.nan: None}).to_dict('records')
        print(f'[DEBUG] 转换数据为JSON格式')
        return jsonify({
            'success': True,
            'data': data
        })

    except Exception as e:
        print(f"获取全量数据时出错: {str(e)}")
        import traceback
        traceback.print_exc()
        return jsonify({
            'success': False,
            'error': f'获取数据时出错: {str(e)}'
        })